/**
 * 文章分页
 */

import { AppDataSource } from '../../db/index'
import { Article } from '../../db/entities/Article'
import dayjs from 'dayjs'

const articleRepository = AppDataSource.getRepository(Article)

export default defineEventHandler(async (event) => {
  let query = getQuery(event)

  console.log('传递过来的参数')
  console.log(query)

  let currentPage = Number(query.currentPage) || 1
  let pageSize = Number(query.pageSize) || 10

  let categoryId = query.categoryId || ''

  let skip = (currentPage - 1) * pageSize

  // 多对多关系的表，在innerJoinAndSelect 的3个参数为条件，可以省略，typeorm自动生成
  //  .innerJoinAndSelect('article.tags', 'tag')
  // 完整写法： article_tag 是中间表的表名
  // .innerJoinAndSelect('article.tags', 'tag', 'article_tag.article_id=article.id and article_tag.tag_id=tag.tag_id')

  // 这里要做Tag表参数的过滤，所以不用 innerJoinAndSelect, 使用 innerJoin + addSelect

  // 内连接，在文章没有设置标签的情况下，不会显示
  // 左连接，即使文章没有设置标签，也会显示
  let queryBuilder = articleRepository
    .createQueryBuilder('article')
    .skip(skip)
    .take(pageSize)
    .leftJoin('article.tags', 'tag')
    .addSelect(['tag.name', 'tag.tag_id'])
    .orderBy('article.createTime', 'DESC')

  if (categoryId && categoryId !== '') {
    // 创建子查询， 先先筛选出符合条件的文章， 只拿文章id， 将这个作为结果，传递给下一个
    let subQuery = articleRepository
      .createQueryBuilder('article')
      .select('article.id')
      .leftJoin('article.tags', 'tag')
      .where('tag.tag_id =:tagId', {
        tagId: categoryId
      })

    // 这种方式只能查询出来标签为 categoryId的，如果一个文章有多个标签，也只会查询出来1个。
    // queryBuilder = queryBuilder.where('tag.tag_id =:tagId', {
    //   tagId: categoryId
    // })

    queryBuilder = queryBuilder.where(`article.id IN (${subQuery.getQuery()})`).setParameters(subQuery.getParameters())
  }

  let rows = await queryBuilder.getManyAndCount()

  return {
    message: '操作成功',
    data: {
      list: rows[0],
      total: rows[1]
    },
    code: 0
  }
})
